package br.com.medvagas.comum.entidade;

import java.io.Serializable;
import java.util.Date;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedNativeQueries;
import javax.persistence.NamedNativeQuery;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import br.com.medvagas.comum.enumeracao.EnumUtil;
import br.com.medvagas.comum.enumeracao.profissional.QualTelefoneContactarEnum;

/**
 * The persistent class for the usuario_profissional database table.
 */
@Entity
@Table(name = "usuario_profissional")
@NamedQueries({
	@NamedQuery(
		name="UsuarioProfissional.consultarPorCpf", 
		query="select u.idUsuarioProfissional from UsuarioProfissional u where u.cpf = :cpf"),
	@NamedQuery(
		name="UsuarioProfissional.consultarPorEmail",
		query="select u.idUsuarioProfissional from UsuarioProfissional u where u.email = :email"),
	@NamedQuery(
		name="UsuarioProfissional.consultarPorEmailCompleto", 
		query="select u from UsuarioProfissional u where u.email = :email"),
	@NamedQuery(
		name="UsuarioProfissional.consultarPorEmailSenha", 
		query="select u from UsuarioProfissional u where u.email = :email and u.senha = :senha"),
	@NamedQuery(
		name="UsuarioProfissional.consultarPorCpfToken", 
		query="select u from UsuarioProfissional u where u.cpf = :cpf and u.tokenValidacaoEmail = :tokenValidacaoEmail"),
	@NamedQuery(
		name="UsuarioProfissional.consultarCandidatosVaga", 
		query="select up from UsuarioProfissional up inner join fetch up.stVagaUsuarioProfissional vup where vup.id.idVaga = :idVaga and vup.vaga.empresa.usuarioEmpresa.idUsuarioEmpresa = :idUsuarioEmpresa"),
	@NamedQuery(
		name="UsuarioProfissional.consultarTodos", 
		query="select up from UsuarioProfissional up order by up.nome"),
	@NamedQuery(
			name="UsuarioProfissional.consultar", 
			query="select up from UsuarioProfissional up order by up.nome"),
	@NamedQuery(
		name="UsuarioProfissional.consultarCurriculo",
		query=
			"select distinct(up) from UsuarioProfissional up" +
				" left join fetch up.stFormacaoAcademicaTitulacao" +
				" left join fetch up.stFormacaoComplementar" +
				" left join fetch up.stParticipacaoEvento" +
				" left join fetch up.stEsperienciaProfissional" +
				" left join fetch up.stLinguaEstrangeira where up.idUsuarioProfissional = :idUsuarioProfissional")
})
@NamedNativeQueries({
	@NamedNativeQuery(
		name="UsuarioProfissional.delete", 
		query="delete from usuario_profissional where id_usuario_profissional = :idUsuarioProfissional", resultClass=UsuarioProfissional.class)
})
public class UsuarioProfissional implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id_usuario_profissional")
	private Integer idUsuarioProfissional;

	@Column(name = "aceitou_termo_servico")
	private Boolean aceitouTermoServico;

	@Column(name = "como_conheceu_site")
	private String comoConheceuSite;
	
	@Column(name = "como_conheceu_site_outro")
	private String comoConheceuSiteOutro;

	@Column(name = "conhecimento_msexcel")
	private Boolean conhecimentoMsexcel;

	@Column(name = "conhecimento_mspowerpoint")
	private Boolean conhecimentoMspowerpoint;

	@Column(name = "conhecimento_msword")
	private Boolean conhecimentoMsword;

	private String cpf;

	@Column(name = "crm_estado")
	private String crmEstado;

	@Column(name = "crm_numero")
	private String crmNumero;

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "data_cadastro")
	private Date dataCadastro;

	@Temporal(TemporalType.DATE)
	@Column(name = "data_nascimento")
	private Date dataNascimento;

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "data_ultima_alteracao")
	private Date dataUltimaAlteracao;

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "data_ultimo_acesso")
	private Date dataUltimoAcesso;

	private String email;

	private String nome;

	@Column(name = "porque_esta_anunciando")
	private String porqueEstaAnunciando;
	
	@Column(name = "porque_esta_anunciando_outro")
	private String porqueEstaAnunciandoOutro;

	@Column(name = "qual_telefone_contactar")
	private String qualTelefoneContactar;

	@Column(name = "receber_informativos")
	private Boolean receberInformativos;

	private String senha;

	private String sexo;

	@Column(name = "telefone_celular")
	private String telefoneCelular;

	@Column(name = "telefone_comercial")
	private String telefoneComercial;

	@Column(name = "telefone_comercial_ramal")
	private String telefoneComercialRamal;

	@Column(name = "telefone_residencial")
	private String telefoneResidencial;

	@Column(name = "token_validacao_email")
	private String tokenValidacaoEmail;

	@Column(name = "usuario_validado")
	private Boolean usuarioValidado;

	//bi-directional many-to-one association to Endereco
    @ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="id_endereco")
	private Endereco endereco;
	
	// bi-directional many-to-one association to EsperienciaProfissional
	@OneToMany(mappedBy = "usuarioProfissional")
	private Set<EsperienciaProfissional> stEsperienciaProfissional;

	// bi-directional many-to-one association to FormacaoAcademicaTitulacao
	@OneToMany(mappedBy = "usuarioProfissional")
	private Set<FormacaoAcademicaTitulacao> stFormacaoAcademicaTitulacao;

	// bi-directional many-to-one association to FormacaoComplementar
	@OneToMany(mappedBy = "usuarioProfissional")
	private Set<FormacaoComplementar> stFormacaoComplementar;

	// bi-directional many-to-one association to LinguaEstrangeira
	@OneToMany(mappedBy = "usuarioProfissional")
	private Set<LinguaEstrangeira> stLinguaEstrangeira;

	// bi-directional many-to-one association to ParticipacaoEvento
	@OneToMany(mappedBy = "usuarioProfissional")
	private Set<ParticipacaoEvento> stParticipacaoEvento;
	
	//bi-directional many-to-one association to VagaUsuarioProfissional
	@OneToMany(mappedBy="usuarioProfissional")
	private Set<VagaUsuarioProfissional> stVagaUsuarioProfissional;
	
	public UsuarioProfissional() {
	}

	public String getQualTelefoneContactarFormatado() {
		return EnumUtil.recuperarLabel(QualTelefoneContactarEnum.values(), qualTelefoneContactar);
	}
	
	public Integer getIdUsuarioProfissional() {
		return this.idUsuarioProfissional;
	}

	public void setIdUsuarioProfissional(Integer idUsuarioProfissional) {
		this.idUsuarioProfissional = idUsuarioProfissional;
	}

	public Boolean getAceitouTermoServico() {
		return this.aceitouTermoServico;
	}

	public void setAceitouTermoServico(Boolean aceitouTermoServico) {
		this.aceitouTermoServico = aceitouTermoServico;
	}

	public String getComoConheceuSite() {
		return this.comoConheceuSite;
	}

	public void setComoConheceuSite(String comoConheceuSite) {
		this.comoConheceuSite = comoConheceuSite;
	}

	public Boolean getConhecimentoMsexcel() {
		return this.conhecimentoMsexcel;
	}

	public void setConhecimentoMsexcel(Boolean conhecimentoMsexcel) {
		this.conhecimentoMsexcel = conhecimentoMsexcel;
	}

	public Boolean getConhecimentoMspowerpoint() {
		return this.conhecimentoMspowerpoint;
	}

	public void setConhecimentoMspowerpoint(Boolean conhecimentoMspowerpoint) {
		this.conhecimentoMspowerpoint = conhecimentoMspowerpoint;
	}

	public Boolean getConhecimentoMsword() {
		return this.conhecimentoMsword;
	}

	public void setConhecimentoMsword(Boolean conhecimentoMsword) {
		this.conhecimentoMsword = conhecimentoMsword;
	}

	public String getCpf() {
		return this.cpf;
	}

	public void setCpf(String cpf) {
		this.cpf = cpf;
	}

	public String getCrmEstado() {
		return this.crmEstado;
	}

	public void setCrmEstado(String crmEstado) {
		this.crmEstado = crmEstado;
	}

	public String getCrmNumero() {
		return this.crmNumero;
	}

	public void setCrmNumero(String crmNumero) {
		this.crmNumero = crmNumero;
	}

	public Date getDataCadastro() {
		return this.dataCadastro;
	}

	public void setDataCadastro(Date dataCadastro) {
		this.dataCadastro = dataCadastro;
	}

	public Date getDataNascimento() {
		return this.dataNascimento;
	}

	public void setDataNascimento(Date dataNascimento) {
		this.dataNascimento = dataNascimento;
	}

	public Date getDataUltimaAlteracao() {
		return this.dataUltimaAlteracao;
	}

	public void setDataUltimaAlteracao(Date dataUltimaAlteracao) {
		this.dataUltimaAlteracao = dataUltimaAlteracao;
	}

	public Date getDataUltimoAcesso() {
		return this.dataUltimoAcesso;
	}

	public void setDataUltimoAcesso(Date dataUltimoAcesso) {
		this.dataUltimoAcesso = dataUltimoAcesso;
	}

	public String getEmail() {
		return this.email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getNome() {
		return this.nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getPorqueEstaAnunciando() {
		return this.porqueEstaAnunciando;
	}

	public void setPorqueEstaAnunciando(String porqueEstaAnunciando) {
		this.porqueEstaAnunciando = porqueEstaAnunciando;
	}

	public String getQualTelefoneContactar() {
		return this.qualTelefoneContactar;
	}

	public void setQualTelefoneContactar(String qualTelefoneContactar) {
		this.qualTelefoneContactar = qualTelefoneContactar;
	}

	public Boolean getReceberInformativos() {
		return this.receberInformativos;
	}

	public void setReceberInformativos(Boolean receberInformativos) {
		this.receberInformativos = receberInformativos;
	}

	public String getSenha() {
		return this.senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public String getSexo() {
		return this.sexo;
	}

	public void setSexo(String sexo) {
		this.sexo = sexo;
	}

	public String getTelefoneCelular() {
		return this.telefoneCelular;
	}

	public void setTelefoneCelular(String telefoneCelular) {
		this.telefoneCelular = telefoneCelular;
	}

	public String getTelefoneComercial() {
		return this.telefoneComercial;
	}

	public void setTelefoneComercial(String telefoneComercial) {
		this.telefoneComercial = telefoneComercial;
	}

	public String getTelefoneComercialRamal() {
		return this.telefoneComercialRamal;
	}

	public void setTelefoneComercialRamal(String telefoneComercialRamal) {
		this.telefoneComercialRamal = telefoneComercialRamal;
	}

	public String getTelefoneResidencial() {
		return this.telefoneResidencial;
	}

	public void setTelefoneResidencial(String telefoneResidencial) {
		this.telefoneResidencial = telefoneResidencial;
	}

	public String getTokenValidacaoEmail() {
		return this.tokenValidacaoEmail;
	}

	public void setTokenValidacaoEmail(String tokenValidacaoEmail) {
		this.tokenValidacaoEmail = tokenValidacaoEmail;
	}

	public Boolean getUsuarioValidado() {
		return this.usuarioValidado;
	}

	public void setUsuarioValidado(Boolean usuarioValidado) {
		this.usuarioValidado = usuarioValidado;
	}

	public Set<EsperienciaProfissional> getStEsperienciaProfissional() {
		return this.stEsperienciaProfissional;
	}

	public void setStEsperienciaProfissional(Set<EsperienciaProfissional> stEsperienciaProfissional) {
		this.stEsperienciaProfissional = stEsperienciaProfissional;
	}

	public Set<FormacaoAcademicaTitulacao> getStFormacaoAcademicaTitulacao() {
		return this.stFormacaoAcademicaTitulacao;
	}

	public void setStFormacaoAcademicaTitulacao(Set<FormacaoAcademicaTitulacao> stFormacaoAcademicaTitulacao) {
		this.stFormacaoAcademicaTitulacao = stFormacaoAcademicaTitulacao;
	}

	public Set<FormacaoComplementar> getStFormacaoComplementar() {
		return this.stFormacaoComplementar;
	}

	public void setStFormacaoComplementar(Set<FormacaoComplementar> stFormacaoComplementar) {
		this.stFormacaoComplementar = stFormacaoComplementar;
	}

	public Set<LinguaEstrangeira> getStLinguaEstrangeira() {
		return this.stLinguaEstrangeira;
	}

	public void setStLinguaEstrangeira(Set<LinguaEstrangeira> stLinguaEstrangeira) {
		this.stLinguaEstrangeira = stLinguaEstrangeira;
	}

	public Set<ParticipacaoEvento> getStParticipacaoEvento() {
		return this.stParticipacaoEvento;
	}

	public void setStParticipacaoEvento(Set<ParticipacaoEvento> stParticipacaoEvento) {
		this.stParticipacaoEvento = stParticipacaoEvento;
	}

	public Endereco getEndereco() {
		return endereco;
	}

	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}

	public String getComoConheceuSiteOutro() {
		return comoConheceuSiteOutro;
	}

	public void setComoConheceuSiteOutro(String comoConheceuSiteOutro) {
		this.comoConheceuSiteOutro = comoConheceuSiteOutro;
	}

	public String getPorqueEstaAnunciandoOutro() {
		return porqueEstaAnunciandoOutro;
	}

	public void setPorqueEstaAnunciandoOutro(String porqueEstaAnunciandoOutro) {
		this.porqueEstaAnunciandoOutro = porqueEstaAnunciandoOutro;
	}

	public Set<VagaUsuarioProfissional> getStVagaUsuarioProfissional() {
		return stVagaUsuarioProfissional;
	}

	public void setStVagaUsuarioProfissional(
			Set<VagaUsuarioProfissional> stVagaUsuarioProfissional) {
		this.stVagaUsuarioProfissional = stVagaUsuarioProfissional;
	}

}